package br.ufg.inf.musica;

import br.ufg.inf.comum.Conexao;
import br.ufg.inf.tag.TagDAO;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;


public class MusicaDAO {
 
    public Musica cadastrar(Musica musica) throws Exception {
        String sql = null;

        try {

            sql = "INSERT INTO MUSICA "
                    + "(nome, artista, genero, url_youtube)"
                    + " VALUES (?, ?, ?, ?);";

            PreparedStatement comandoSql = Conexao.getConnection().prepareStatement(sql);
            comandoSql.setString(1, musica.getNome());
            comandoSql.setString(2, musica.getArtista());
            comandoSql.setString(3, musica.getGenero());
            comandoSql.setString(4, musica.getUrlYoutube());

            comandoSql.executeUpdate();


            musica = this.obter(musica.getNome(), musica.getArtista(), musica.getUrlYoutube());


            return musica;

        } catch (Exception ex) {
            System.out.println("    MusicaDAO.cadastrar: Erro ao executar SQL: '" + sql + "'.");
            Conexao.close();
            throw ex;
        }


    }

    public Musica obter(int id_musica) throws Exception {
        String sql = "SELECT * FROM MUSICA WHERE id_musica = ?;";

        PreparedStatement comandoSql = Conexao.getConnection().prepareStatement(sql);
        comandoSql.setInt(1, id_musica);

        return obter(comandoSql);

    }

    public Musica obter(String nome_musica, String nome_artista, String nome_url) throws Exception {
        String sql = "SELECT * FROM MUSICA WHERE NOME = ? AND ARTISTA = ? AND URL_YOUTUBE = ?;";

        PreparedStatement comandoSql = Conexao.getConnection().prepareStatement(sql);
        comandoSql.setString(1, nome_musica);
        comandoSql.setString(2, nome_artista);
        comandoSql.setString(3, nome_url);

        return obter(comandoSql);
    }

    public Musica obter(PreparedStatement comandoSql) throws Exception {

        try {

            ResultSet rs = comandoSql.executeQuery();
            Musica musica = null;

            TagDAO tagDAO = new TagDAO();
            if (rs.next()) {
                musica = new Musica();
                musica.setId(rs.getInt("ID_MUSICA"));
                musica.setNome(rs.getString("NOME"));
                musica.setArtista(rs.getString("ARTISTA"));
                musica.setGenero(rs.getString("GENERO"));
                musica.setUrlYoutube(rs.getString("URL_YOUTUBE"));
                musica.setTags(tagDAO.listarTagsDaMusica(musica.getId()));
            }


            return (musica);

        } catch (Exception ex) {
            System.out.println("    MusicaDAO.obter: Erro ao executar SQL");
            Conexao.close();
            throw ex;
        }
    }

    public ArrayList<Musica> listarMusicasPorTag(int id_tag) throws Exception {

        String sql = null;
        try {

            sql = "SELECT "
                    + " mus.*"
                 + " FROM "
                    + " musica mus, musica_x_tag mxt"
                 + " WHERE "
                    + " mus.id_musica = mxt.id_musica"
                + " and mxt.id_tag = ?;";

            PreparedStatement comandoSql = Conexao.getConnection().prepareStatement(sql);
            comandoSql.setInt(1, id_tag);


            ResultSet rs = comandoSql.executeQuery();
            ArrayList<Musica> lista = new ArrayList<Musica>();
            Musica musica = null;


            while (rs.next()) {
                musica = new Musica();
                musica.setId(rs.getInt("ID_MUSICA"));
                musica.setNome(rs.getString("NOME"));
                musica.setArtista(rs.getString("ARTISTA"));
                musica.setGenero(rs.getString("GENERO"));
                musica.setUrlYoutube(rs.getString("URL_YOUTUBE"));

                lista.add(musica);
            }


            return lista;
        } catch (Exception ex) {
            System.out.println("    MusicaDAO.listarMusicasPorTag: Erro ao executar SQL: '" + sql + "'.");
            Conexao.close();
            throw ex;
        }

    }

    public void delete(Musica musica) throws Exception {
        String sql = null;

        try {

            sql = "DELETE FROM MUSICA WHERE id_musica = ?;";

            PreparedStatement comandoSql = Conexao.getConnection().prepareStatement(sql);
            comandoSql.setInt(1, musica.getId());


            comandoSql.executeUpdate();

        } catch (Exception ex) {
            System.out.println("    MusicaDAO.delete: Erro ao executar SQL: '" + sql + "'.");
            Conexao.close();
            throw ex;
        }
    }
}
